home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / umlaute / cs_patch.uue / PATCH_CS.ZIP / PATCH_CS.C next >
Encoding:
C/C++ Source or Header  |  1994-11-29  |  2.2 KB  |  88 lines

  1. /*
  2.     Dieses Programm versucht MultiTeX/CS-TeX ab 3.14 so zu patchen,
  3.     daž der Cork-Tabellen-Hack wirkungslos wird. Damit funktioniert
  4.     das umlaut-package dann einwandfrei.
  5.     VOR DER ANWENDUNG VORSICHTSHALBER EIN BACKUP DES TEX*.TTP ANLEGEN!!!
  6.     VERWENDUNG DES PROGRAMMS AUF EIGENE GEFAHR!!!!
  7.     Mehrfaches Patchen spielt keine Rolle.
  8.     (c) Markus Kohm @ KA2, 1994
  9. */
  10.  
  11. #include <stdio.h>
  12.  
  13. int main( int argc, const char *argv[] ) {
  14.   FILE *tex;
  15.   char puffer[128];
  16.   short magic;
  17.   long  ph_tlen;
  18.   long  ph_dlen;
  19.   long  l;
  20.   int i;
  21.   puts( "@(#)CS-TeX-Patch (c) Markus Kohm, Nov 21 1994\n" + 4 );
  22.   if ( argc != 2 ) {
  23.     fputs( "Usage: texpatch <texpath+name>\n", stderr );
  24.     return 1;
  25.   }
  26.   puts( "Open tex: " );
  27.   puts( argv[1] );
  28.   if ( ( tex = fopen( argv[1], "rb+" ) ) == NULL ) {
  29.     perror( "fopen" );
  30.     return 2;
  31.   }
  32.   if ( ( fread( &magic, 2, 1, tex ) != 1 ) ||
  33.        ( fread( &ph_tlen, 4, 1, tex ) != 1 ) ||
  34.        ( fread( &ph_dlen, 4, 1, tex ) != 1 ) ) {
  35.     perror( "fread" );
  36.     fclose( tex );
  37.     return 2;
  38.   }
  39.   if ( fseek( tex, ph_tlen+0x1C, SEEK_SET ) ) {
  40.     perror( "fseek" );
  41.     fclose( tex );
  42.     return 2;
  43.   }
  44.   puts( "Search Cork-table." );
  45.   if ( fread( puffer, 127, 1, tex ) != 1 ) {
  46.     perror( "fread" );
  47.     fclose( tex );
  48.     return 3;
  49.   }
  50.   l = ph_tlen + 0x1C;
  51.   while ( ph_dlen >= 256 ) {
  52.     if ( fread( puffer+127, 1, 1, tex ) != 1 ) {
  53.       perror( "fread" );
  54.       fclose( tex );
  55.       return 3;
  56.     }
  57.     for ( i = 0; (i < 128) && (puffer[i] == i); i++ );
  58.     if ( i == 128 ) {
  59.       puts( "Cork-table found." );
  60.       for ( i = 0; i < 128; i++ )
  61.         puffer[i] = i+128;
  62.       l += 128;
  63.       if ( fseek( tex, l, SEEK_SET ) ) {
  64.         perror( "fseek" );
  65.         fclose( tex );
  66.         return 3;
  67.       }
  68.       if ( fwrite( puffer, 128, 1, tex ) != 1 ) {
  69.         perror( "fwrite" );
  70.         fclose( tex );
  71.         return 4;
  72.       }
  73.       if ( fclose( tex ) ) {
  74.         perror( "fclose" );
  75.         return 4;
  76.       }
  77.       puts( "Cork-table deleted!" );
  78.       return 0;
  79.     }
  80.     ph_dlen--;
  81.     l++;
  82.     for ( i = 0; i < 127; i++ )
  83.       puffer[i] = puffer[i+1];
  84.   }
  85.   fputs( "Cannot find Cork-table!\n", stderr );
  86.   return 3;
  87. }
  88.